package com.monster.dao;

import com.monster.pojo.Album;
import com.monster.pojo.Playlist;
import com.monster.pojo.Singer;
import com.monster.pojo.Song;
import com.monster.pojo.User;

import java.util.ArrayList;

/**
 * User的数据访问层接口，包含查询user表和相关联的其他表得到与user相关的数据的方法签名
 * @author cyb
 */
public interface UserDao {
    /**
     * 根据id查询user表得到用户信息
     * @param id
     * @return
     */
    User getUserById(Long id);

    /**
     * 根据user_id和focus_type=1联表分页查询得到关注的singer集合
     * @param userId
     * @param page 页号
     * @return Singer集合
     */
    ArrayList<Singer> listFocusSingesByUserId(Long userId, int page);

    /**
     * 根据user_id和focus_type=2联表分页查询得到关注的user集合
     * @param userId
     * @param page 页号
     * @return User集合
     */
    ArrayList<User> listFocusUsersByUserId(Long userId, int page);

    /**
     * 根据user_id和like_type=1联表分页查询得到我喜欢的song集合
     * @param userId
     * @param page 页号
     * @return Song集合
     */
    ArrayList<Song> listLikeSongsByUserId(Long userId, int page);

    /**
     * 根据user_id和like_type=2联表分页查询得到我喜欢的playlist集合
     * @param userId
     * @param page 页码
     * @return Playlist集合
     */
    ArrayList<Playlist> listLikePlaylistsByUserId(Long userId, int page);

    /**
     * 根据user_id和like_type=3联表分页查询得到我喜欢的album集合
     * @param userId
     * @return Album集合
     */
    ArrayList<Album> listLikeAlbumsByUserId(Long userId, int page);

    /**
     * 根据focus_type=2和focus_id联表分页查询得到粉丝user集合
     * @param userId
     * @param page 页码
     * @return User集合
     */
    ArrayList<User> listFansByUserId(Long userId, int page);

    /**
     * 根据user_id联表查询得到关注数
     * @param userId
     * @return int 关注数
     */
    int getFollowCountByUserId(Long userId);

    /**
     * 根据user_id联表查询得到粉丝数
     * @param userId
     * @return int 粉丝数
     */
    int getFansCountByUserId(Long userId);

    /**
     * 添加用户
     * @param user
     * @return sql语句执行后的影响行数
     */
    int addUser(User user);

    /**
     * 修改用户
     * @param user
     * @return sql语句执行后的影响行数
     */
    int updateUser(User user);

    /**
     * 根据关键字模糊查询用户信息，按粉丝数降序
     * @param key
     * @return
     */
    ArrayList<User> listUsersByFuzzy(String key);

    /**
     * 根据user_id查询user_play表得到听歌列表song的id集合
     * @param userId
     * @return songid集合
     */
    ArrayList<Long> listPlaySongsByUserId(Long userId);

    /**
     * 在user_play中添加user_id和song_id的对应关系
     * @param userId
     * @param songId
     * @return
     */
    int addPlaySong(Long userId, Long songId);

    /**
     * 从user_play中删除user_id和song_id的对应关系
     * @param userId
     * @param songId
     * @return
     */
    int deletePlaySong(Long userId, Long songId);

    /**
     * 查询user表获得手机号为特定号码的用户数量
     * @param phoneNumber 手机号
     * @return 用户数量
     */
    Long getUserIdByPhone(String phoneNumber);

    /**
     * 查询user表获得手机号和密码为特点的用户id
     * @param phoneNumber 手机号
     * @param password 密码
     * @return 用户id
     */
    Long getUserIdByPhoneAndPassword(String phoneNumber, String password);

    /**
     * 向user_like表中添加收藏信息
     * @param userId 用户Id
     * @param likeType 收藏类型，其中1为song，2为playlist，3为album
     * @param likeId 收藏的id，表示likeType类型对应的Id
     * @return sql语句影响行数
     */
    int addUserLike(Long userId, int likeType, Long likeId);

    /**
     * 删除user_like表中指定Id的收藏信息
     * @param userLikeId ul_id
     * @return sql语句影响行数
     */
    int deleteUserLike(Long userLikeId);

    /**
     * 向user_focus表中添加关注信息
     * @param userId 用户Id
     * @param focusType 关注类型，其中1为singer，2为user
     * @param focusId 关注的id，表示focusType类型对应的Id
     * @return sql语句影响行数
     */
    int addUserFocus(Long userId, int focusType, Long focusId);

    /**
     * 删除user_focus表中指定Id的收藏信息
     * @param userFocusId uf_id
     * @return sql语句影响行数
     */
    int deleteUserFocus(Long userFocusId);

}
